<?php
/**
 *  Helpers帮助工具类
 *
 * (添加新工具类，类注释写上相应作者，需要写相应文档，相同功能工具只写一个)
 */
if (!function_exists('module_path')) {
    /**
     * 获取指定模块的文件路径
     *
     * @param [type] $name
     * @param string $path
     * @return void
     */
    function module_path($name, $path = '')
    {
        $module = base_path('app/Modules/') . $name;
        return $module . ($path ? DIRECTORY_SEPARATOR . $path : $path);
    }
}

if (!function_exists('array_key_reversal')) {

    function array_key_reversal($array)
    {
        if (!is_array($array)) {
            return $array;
        }
        $result = [];
        foreach ($array as $value) {
            $temp = '';
            foreach ($value as $k => $v) {
                if ($k == 'key') {
                    $temp = $v;
                }
                if ($k == 'value') {
                    $result[$temp] = $v;
                }
            }
        }
        return $result;
    }
}

if (!function_exists('get_client_ip')) {
    /**
     * 获取客户端ip
     * @param integer $type 返回类型 0 返回IP地址 1 返回IPV4地址数字
     * @param boolean $adv 是否进行高级模式获取（有可能被伪装）
     * @return null|string
     */
    function get_client_ip($type = 0, $adv = true)
    {
        // 简化 $type 的赋值逻辑
        $type = $type === 1 ? 1 : 0;

        $server = request()->server();
        $ips = request()->getClientIps(); // 提前获取，避免重复调用

        // 开始时定义默认IP，避免最后无有效IP时返回 '0.0.0.0'
        $ip = '0.0.0.0';

        if ($adv) {
            if (isset($server['HTTP_X_FORWARDED_FOR'])) {
                $arr = explode(',', $server['HTTP_X_FORWARDED_FOR']);
                $pos = array_search('unknown', $arr);
                if (false !== $pos) {
                    unset($arr[$pos]);
                }
                $ip = trim($arr[0]);
            } elseif (isset($server['HTTP_CLIENT_IP'])) {
                $ip = $server['HTTP_CLIENT_IP'];
            } elseif (isset($server['REMOTE_ADDR'])) {
                $ip = $server['REMOTE_ADDR'];
            } else {
                $ip = last($ips);
            }
        } elseif (isset($server['REMOTE_ADDR'])) {
            $ip = $server['REMOTE_ADDR'];
        } else {
            $ip = last($ips);
        }

        $ip = trim($ip);

        // IP地址合法验证
        $long = sprintf("%u", ip2long($ip));
        $validIp = $long !== false ? $ip : '0.0.0.0'; // 若IP非法，则明确使用 '0.0.0.0'
        $ipInfo = $validIp !== '0.0.0.0' ? array($validIp, sprintf("%u", ip2long($validIp))) : array('0.0.0.0', 0);

        return $ipInfo[$type];
    }
}
